// import { message } from 'ant-design-vue';
import { ElMessage } from 'element-plus'
import axios, { AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios'
import { getToken } from '@/plugins/cookies'

// 跨域认证信息 header 名
const xsrfHeaderName = 'token'

//1. 创建新的axios实例，
const service = axios.create({
    // timeout: 10 * 1000,
    withCredentials: true,
    xsrfHeaderName: xsrfHeaderName,
    xsrfCookieName: xsrfHeaderName,
})

// 2.请求拦截器
service.interceptors.request.use((config: InternalAxiosRequestConfig) => {
    return config
}, error => {
    Promise.reject(error)
})

// 3.响应拦截器
service.interceptors.response.use((response: AxiosResponse<any>) => {
    return response
}, error => {

    /***** 异常处理 *****/
    if (error && error.response) {
        // 1.公共错误处理 // 2.根据响应码具体处理
        switch (error.response.status) {
            case 201:
                error.message = '请求方式错误'
                break;
            case 400:
                error.message = '错误请求'
                break;
            case 401:
                error.message = '未授权，请重新登录'
                break;
            case 403:
                error.message = '拒绝访问'
                break;
            case 404:
                error.message = '请求错误,未找到该资源'
                break;
            case 405:
                error.message = '请求方法未允许'
                break;
            case 408:
                error.message = '请求超时'
                break;
            case 500:
                error.message = '服务器端出错'
                break;
            case 501:
                error.message = '网络未实现'
                break;
            case 502:
                error.message = '网络错误'
                break;
            case 503:
                error.message = '服务不可用'
                break;
            case 504:
                error.message = '网络超时'
                break;
            case 505:
                error.message = 'http版本不支持该请求'
                break;
            default:
                error.message = `连接错误${error.response.status}`
        }
    } else {
        // 超时处理
        if (JSON.stringify(error).includes('timeout')) {
            error.message = '服务器响应超时，请刷新当前页'
        } else {
            error.message = '连接服务器失败'
        }
    }
    ElMessage.error(error.message)

    return Promise.resolve(error)
})

/**
 * 网络请求
 * @params {} 网络请求参数配置
 * @param url 接口地址
 * @param apiKey 接口地址配置（同api配合） 如： ['common', 'dicCache']
 * @param params 参数
 * @param method 方法
 * @param contentType 请求头类型
 * @param showError 是否展示错误信息
 * @param blob 是否blob（下载）
 * @param responseType 返回格式(下载用)
 * @param timeout 接口请求超时时间 默认5秒
 * @returns {Promise<any>}
 */
// 错误和失败信息都在这里进行处理，界面中调用的时候只处理正确数据即可
export const request = ({
    url = undefined,
    apiKey = [], // apiKey.length必须为2
    params = {},
    method = 'post',
    contentType = 1,
    showError = true,
    blob = false,
    responseType = 'json',
    timeout = 60 * 1000
}: AxiosRequestConfig = {}): Promise<unknown> => {

    // 根据method 判断是传params 还是 data
    const dataType = method.toLocaleLowerCase() === 'get' ? 'params' : 'data'
    let rParams = {
        url: url || getApiUrl(apiKey),
        method,
        responseType,
        [dataType]: params,
        timeout,
        headers: {
            'Content-Type': contentType == 1 ? 'application/json;charset=UTF-8' : `multipart/form-data;boundary=${new Date().getTime()}`,
            'token': getToken()
        }
    }
    return new Promise((resolve, reject) => {

        service(rParams).then(res => {
            // console.log('res',res)
            if (res) {
                if (blob) {
                    if (res?.headers?.['content-disposition']) {
                        resolve(res)
                    } else {
                        if (res.data) {
                            let fileReader = new FileReader()
                            fileReader.readAsText(res.data)
                            fileReader.onload = function (result) {
                                let jsondata = JSON.parse(result?.target?.result as string)
                                ElMessage.warning(jsondata.message);
                            }
                        }
                        reject()
                    }
                } else {
                    // console.log('res', res)
                    if (res.status == 200) {
                        // 暂无可用状态，临时判断登录失效
                        // if (res?.data?.code == "9999" && res?.data?.message.indexOf('TOKEN') > -1) {
                        //     window?.parent?.logoutFuc?.(); // 父级工程跳转登录页
                        //     return
                        // }
                        
                        // 暂无可用状态，临时判断登录失效
                        // if(res?.data?.code == "9999" && res?.data?.message.indexOf('TOKEN')>-1){
                        //     router.push({ path: '/login' })
                        //     return
                        // }

                        // 获取请求结果
                        if (res?.data?.msg || res?.data.data.length > 0) {
                            resolve({
                                ...res.data,
                                total: res?.data?.total ?? res?.data?.totalRows ?? 0
                            })
                            // console.log('request-res',res)
                        } else {
                            if (showError && res?.data?.msg) {
                                ElMessage.warning(res.data.msg)
                            }
                            reject(res.data)
                        }
                    } else {
                        if (showError && res?.data?.msg) {
                            ElMessage.warning(res.data.msg)
                        }
                        reject(res)
                    }
                }
            } else {
                reject()
            }
        }).catch(err => {
            if (showError) {
                ElMessage.warning('请求失败，请稍后再试')
                // if (errInfo.value != '') {
                //     ElMessage.warning(errInfo.value)
                // }
            }
            reject(err)
        })
    })
}


type fileObj = {
    [proName: string]: any
}
function getApiUrl(apiKey: Array<string>) {
    const file: fileObj = import.meta.glob('./api.ts', { eager: true })['./api.ts'] as object

    if (apiKey && apiKey.length === 2) {
        return file?.[apiKey[0]]?.[apiKey[1]]
    } else {
        return ''
    }
}

export default service